package com.evil.application.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.evil.application.pojo.entity.ApplicationProcess;
import com.evil.application.pojo.entity.ApplicationProcessNode;
import com.evil.common.account.dto.user.UserEnterpriseDTO;
import com.evil.common.application.dto.order.node.OrderNodeReqDTO;
import com.evil.common.application.dto.process.node.NodeBaseDTO;
import com.evil.common.application.dto.process.node.NodeRespInfoDTO;
import com.evil.common.application.enums.ApplicationVersionEnum;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 应用流程节点表
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
public interface ApplicationProcessNodeService extends IService<ApplicationProcessNode> {

    /**
     * 应用发布版 节点列表
     *
     * @param applicationId applicationId
     * @return List
     */
    List<ApplicationProcessNode> appReleaseNodes(Long applicationId);

    /**
     * 应用流程节点列表
     *
     * @param processId processId
     * @return List
     */
    List<ApplicationProcessNode> findByProcessId(Long processId);

    /**
     * 获取节点基础信息
     *
     * @param id            id
     * @param filterDeleted filterDeleted
     * @return NodeBaseDTO
     */
    NodeBaseDTO findBaseById(Long id, boolean filterDeleted);

    /**
     * 获取节点基础信息列表
     *
     * @param ids           ids
     * @param filterDeleted filterDeleted
     * @return NodeBaseDTO 列表
     */
    List<NodeBaseDTO> findBaseByIds(Collection<Long> ids, boolean filterDeleted);

    /**
     * 获取节点基础信息列表
     *
     * @param ids           ids
     * @param filterDeleted filterDeleted
     * @return NodeBaseDTO 列表
     */
    Map<Long, NodeBaseDTO> findBaseMapByIds(Collection<Long> ids, boolean filterDeleted);

    /**
     * 获取流程节点信息列表
     *
     * @param process process
     * @return NodeRespInfoDTO 列表
     */
    List<NodeRespInfoDTO> findByProcess(ApplicationProcess process);

    /**
     * 获取应用开始节点
     *
     * @param applicationId applicationId
     * @return ApplicationProcessNode
     */
    ApplicationProcessNode findStartNode(Long applicationId);

    /**
     * 获取应用开始节点map
     *
     * @param appIds      appIds
     * @param versionEnum versionEnum
     * @return key:appId, value:nodeId
     */
    Map<Long, Long> findAppStartNodeMap(Collection<Long> appIds, ApplicationVersionEnum versionEnum);

    /**
     * 获取节点处理人
     *
     * @param orderNodeReqDTO orderNodeReqDTO
     * @return List
     */
    List<UserEnterpriseDTO> getNodeHandlers(OrderNodeReqDTO orderNodeReqDTO);

    /**
     * 复制应用流程节点
     *
     * @param source       source
     * @param target       target
     * @param controlIdMap 新旧控件id映射
     * @param updateSource 是否需要更新源信息
     * @return Map 新旧节点id映射
     */
    Map<Long, Long> copyNode(ApplicationProcess source, ApplicationProcess target, Map<Long, Long> controlIdMap, boolean updateSource);

    /**
     * 初始化流程节点
     *
     * @param process process
     */
    void initNode(ApplicationProcess process);

    /**
     * 删除流程节点
     *
     * @param process process
     */
    void deleteProcessNode(ApplicationProcess process);
}
